package org.example.day04;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO
 * <div>  1.众数是指一组数据中出现次数量多的那个数，众数可以是多个 </div> <div>  <span>2.中位数是指把一组数据从小到大排列，最中间的那个数，如果这组数据的个数是奇数，那最中间那个就是中位数，如果这组数据的个数为偶数，那就把中间的两个数之和除以2，所得的结果就是中位数</span><br> </div> <div>  <span>3.查找整型数组中元素的众数并组成一个新的数组，求新数组的中位数</span><br> </div> <div>  <br> </div>
 *
 * 众数是指一组数据中出现次数量多的那个数，众数可以是多个
 * 中位数是指把一组数据从小到大排列，最中间的那个数，如果这组数据的个数是奇数，那最中间那个就是中位数，如果这组数据的个数为偶数，那就把中间的两个数之和除以2，所得的结果就是中位数
 * 查找整型数组中元素的众数并组成一个新的数组，求新数组的中位数
 * @date 2024/3/11 15:22
 */
public class test064 {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 2, 2, 4, 4, 4, 5};
        int[] modeArray = findMode(array);
        double median = findMedian(modeArray);

        System.out.println("Mode Array: " + Arrays.toString(modeArray));
        System.out.println("Median: " + median);
    }

    // 查找众数并返回包含众数的新数组
    public static int[] findMode(int[] array) {
        Map<Integer, Integer> frequencyMap = new HashMap<>();
        for (int num : array) {
            frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
        }

        int maxFrequency = 0;
        for (int frequency : frequencyMap.values()) {
            maxFrequency = Math.max(maxFrequency, frequency);
        }

        int[] modeArray = new int[maxFrequency];
        int modeIndex = 0;

        for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
            if (entry.getValue() == maxFrequency) {
                modeArray[modeIndex++] = entry.getKey();
            }
        }

        // 截断数组，移除未使用的空间
        return Arrays.copyOf(modeArray, modeIndex);
    }

    // 查找新数组的中位数
    public static double findMedian(int[] array) {
        Arrays.sort(array);

        int length = array.length;
        if (length % 2 == 0) {
            // 数组长度为偶数
            return (array[length / 2 - 1] + array[length / 2]) / 2.0;
        } else {
            // 数组长度为奇数
            return array[length / 2];
        }
    }
}
